package com.cskaoyan.javase.oop3._3inner._3loacl._2usecase;

import com.sun.media.jfxmedia.events.NewFrameEvent;

import java.io.PushbackInputStream;

/**
 * 局部内部类的经典使用
 * 主要有两个使用场景:
 *      1.假如方法需要返回一个对象,在返回值类型的地方,写一个引用数据类型
 *          这时方法可以返回该类型对象,也可以返回它的子类对象
 *      2.假如方法调用需要传入一个对象,也就是说,方法的形参数据类型写的是一个引用数据类型
 *          这时,方法调用时的实参,必须传入该类型的对象,或者该类型的子类对象
 *
 *
 * @since 11:21
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // method().test();
        // method2().test();
        method(new Student());
        class NewStudent extends Student {
            @Override
            public void test() {
                System.out.println("我是局部内部类的A");
            }
        }
        method(new NewStudent());

        class IAImpl implements IA {
            @Override
            public void test() {
                System.out.println("hello world!");
            }
        }

        method(new IAImpl());
    }

    public static void method(Student s) {
        s.test();
    }

    public static void method(IA a) {
        a.test();
    }

    public static Student method() {
        class NewStudent extends Student {
            @Override
            public void test() {
                System.out.println("我是局部内部类的Student");
            }
        }
        return new NewStudent();
    }

    public static AbstractA method2() {
        class A extends AbstractA {
            @Override
            public void test() {
                System.out.println("我是实现抽象类的A");
            }
        }
        // 这时必须返回抽象类的子类对象
        return new A();
    }
}

class Student {
    public void test() {
        System.out.println("我是独立的类Student");
    }
}

abstract class AbstractA {
    public abstract void test();
}

interface IA {
    void test();
}
